﻿using System.Collections.Generic;

namespace SharedTypes
{
    public struct AcceptableValue
    {
        public object values { get; set; }
        public long Percent { get; set; }
        public string TextValues { get; set; }
    };

    public class LinkedParameter
    {
        public int parentKey;
        public IParameter parameter;
        public LinkedParameter(int parent, IParameter param)
        {
            parentKey = parent;
            parameter = param;
        }
    };

    /// <summary>
    /// Базовый интерфейс, описывающий параметр алгоритма исполнительного файла.
    /// </summary>
    public interface IParameter
    {
        /// <summary>
        /// Порядковый номер параметра.
        /// </summary>
        byte OrderNum { get; }

        /// <summary>
        /// Имя параметра.
        /// </summary>
        string Name { get; }

        /// <summary>
        /// Условное связывание.
        /// </summary>
        string ConditionLink { get; }

        /// <summary>
        /// Краткое описание параметра.
        /// </summary>
        string ShortDescription { get; }

        /// <summary>
        /// Описание параметра.
        /// </summary>
        string Description { get; }

        /// <summary>
        /// Список допустимых значений параметра и процентное соотношение.
        /// </summary>
        IList<AcceptableValue> AcceptableValues { get; }

        /// <summary>
        /// Количество допустимых значений.
        /// </summary>
        int NumOfAcceptableValues { get; }

        /// <summary>
        /// Текущий параметр.
        /// </summary>
        AcceptableValue CurrentAcceptValue { get; set; }        

        /// <summary>
        /// Текущее значение параметра.
        /// </summary>
        object CurrentValue { get; set; }

        /// <summary>
        /// Значение после заданого значения.
        /// </summary>
        string ValueEnd { get; }

        /// <summary>
        /// Разделитель.
        /// </summary>
        string Separator { get; }

        /// <summary>
        /// Значение по умолчанию.
        /// </summary>
        object DefaultValue { get; }

        /// <summary>
        /// Является ли параметр ключевым
        /// </summary>
        bool IsParamKey { get; }

        /// <summary>
        /// Тип параметра
        /// </summary>
        int Type { get; }

        /// <summary>
        /// Функция, присваивающая параметра случайное значение
        /// из списка допустимых.
        /// </summary>
        void PlaceParamInRandomState();

        /// <summary>
        /// Функция, присваивающая параметра случайное значение
        /// из списка допустимых.
        /// </summary>
        void PlaceValuesInRandomState();
    }
}
